#ifndef _XIOT_H_
#define _XIOT_H_

#include "FreeRTOS.h"
#include "queue.h"
#include "timers.h"

// xiot 事件类型
typedef enum {
    // XIOT 初始化事件
    XIOT_EVENT_INIT,
    // XIOT 认证事件
    XIOT_EVENT_AUTH,
    // XIOT 认证成功事件
    XIOT_EVENT_AUTH_SUCCESS,
    // XIOT 认证失败事件
    XIOT_EVENT_AUTH_FAIL,
    // XIOT 连接事件
    XIOT_EVENT_CONNECT,
    // XIOT 连接成功事件
    XIOT_EVENT_CONNECT_SUCCESS,
    // XIOT 连接失败事件
    XIOT_EVENT_CONNECT_FAIL,
    // XIOT 发送事件
    XIOT_EVENT_SEND,
    // XIOT 发送成功事件
    XIOT_EVENT_SEND_SUCCESS,
    // XIOT 发送失败事件
    XIOT_EVENT_SEND_FAIL,
    // XIOT 接收数据事件
	XIOT_EVENT_RECEIVE_DATA,
    // XIOT 接收超时事件
	XIOT_EVENT_RECEIVE_TIMEOUT,
    // XIOT 断开连接事件
	XIOT_EVENT_DISCONNECT,
    // XIOT 未知事件
	XIOT_EVENT_UNKNOWN
} XiotEventType;

// xiot 事件结构体
typedef struct {
    XiotEventType type;
    void *message;
    // XiotDataToSend dataToSend;
} XiotEvent;

typedef struct luat_mqtt_connopts
{
    const char* host;/**< 服务器HOST*/
    uint16_t port;/**< 服务器端口*/
    uint8_t is_tls;/**< 是否采用tls加密*/
    uint8_t is_ipv6;
    uint8_t verify;
    const char* server_cert;
    size_t server_cert_len;
    // const char* client_cert;
    size_t client_cert_len;
    const char* client_key;
    size_t client_key_len;
    const char* client_password;
    size_t client_password_len;
}XiotMessage_CONNECT;

typedef struct{
    const char* topic;
    const void* sendDataContent; // xiot数据发送内容指针
}XiotMessage_SEND;

// 消息类型枚举
typedef enum {
	XIOT_STATE_DEINIT = 0,
	XIOT_STATE_INITIALIZED,
    XIOT_STATE_REGISTERED,
    XIOT_STATE_CONNECTED,
    XIOT_STATE_DISCONNECTED
} XiotState;

// 消息类型枚举
typedef enum {
    // XIOT 初始化消息
    XIOT_MSG_INIT = 0,
    // XIOT 初始化响应消息
    XIOT_MSG_INIT_RESPONSE,
    // XIOT 认证消息
    XIOT_MSG_AUTH,
    // XIOT 认证成功消息
    XIOT_MSG_AUTH_SUCCESS,
    // XIOT 认证失败消息
    XIOT_MSG_AUTH_FAIL,
    // XIOT 连接消息
    XIOT_MSG_CONNECT,
    // XIOT 连接成功消息
    XIOT_MSG_CONNECT_SUCCESS,
    // XIOT 连接失败消息
    XIOT_MSG_CONNECT_FAIL,
    // XIOT 发送消息
    XIOT_MSG_SEND,
    // XIOT 发送成功消息
    XIOT_MSG_SEND_SUCCESS,
    // XIOT 发送失败消息
    XIOT_MSG_SEND_FAIL,
    // XIOT 接收数据消息
    XIOT_MSG_RECEIVE_DATA,
    // XIOT 接收超时消息
    XIOT_MSG_RECEIVE_TIMEOUT,
    // XIOT 断开连接消息
    XIOT_MSG_DISCONNECT,
    // //获取 XIOT 状态
    // XIOT_MSG_GET_STATED,
    // XIOT 未知消息
    XIOT_MSG_UNKNOWN
} XiotMsgType;


// xiot 数据发送数据结构
typedef struct {
    //接收到的主题
    const char* topic;
    //xiot数据发送内容指针
    const void* receiveMsgContent; 
} XiotReport_RECEIVE_DATA;

// // xiot 数据发送数据结构
// typedef struct {
//     uint8_t sendDataType;     // xiot数据发送类型
//     const void* sendDataContent; // xiot数据发送内容指针
// } XiotDataToSend;

// xiot 链接异常数据枚举
typedef enum {
    // 链接正常
    XIOT_CONNECT_OK = 0,
    // 链接超时
    XIOT_CONNECT_TIMEOUT,
    // 链接认证超时
    XIOT_CONNECT_AUTH_TIMEOUT,
    // 链接产品错误
    XIOT_CONNECT_PRODUCT_ERROR,
    // 链接设备错误
    XIOT_CONNECT_DEVICE_ERROR,
    // 链接秘钥错误
    XIOT_CONNECT_SECRET_ERROR,
    // 链接认证失败
    XIOT_CONNECT_AUTH_FAIL,

}XiotReport_XiotConnectState;

  // xiot report 数据结构
typedef struct {
    XiotState xiotState;  // xiot注册状态
                          // XiotMsgType     xiotMsgType;      // xiot接收消息类型
                          // XiotDataToSRecv xiotDataToSRecv;  // xiot接收数据
                          // XiotDataToSend  xiotDataToSend;   // xiot发送数据
} XiotReport_XiotState;

  // xiot report 数据结构
typedef struct {
    XiotReport_XiotConnectState xiotConnectState;  // xiot注册状态
                                                   // XiotMsgType     xiotMsgType;      // xiot接收消息类型
                                                   // XiotDataToSRecv xiotDataToSRecv;  // xiot接收数据
                                                   // XiotDataToSend  xiotDataToSend;   // xiot发送数据
} XiotReport_XiotAuth;


// xiot模块接口
typedef struct {
    void (*Init)(void);
    void (*Deinit)(void);
    // void (*EventLoopTask)(void*);
    uint8_t (*GetReport)(XiotReport *report);
    void (*Handle)(XiotEventType *eventType);
	void (* userEventHook)(XiotEvent *event, XiotReport *report);
} XiotModule;

// xiot模块实例化
extern XiotModule xiot;

#endif // _XIOT_H_